import pygame
from Logger import Logger
from Ticker import Ticker

################################################################################
class TackGame():
    """
    Convenience class to organise TACK modules and manage PyGame
    
    param - sLogPath : File path to log file
    param - nLogPrintLevel : Minimum log priority for message to be printed to the screen
    param - nLogFileLevel : Minimum log priority for message to be printed to the log file
    param - nTickerFrameRate : Number of frames per second
    """
    ############################################################################
    def __init__(self, 
            sLogPath=None, 
            nLogPrintLevel=2, 
            nLogFileLevel=1, 
            nTickerFrameRate=30, 
        ):
        # Add event callbacks
        self._dModules = {}
        self._lModules = []
        self._sLogPath = sLogPath
        self._nLogPrintLevel = nLogPrintLevel
        self._nLogFileLevel = nLogFileLevel
        self._nTickerFrameRate = nTickerFrameRate
    ############################################################################
    
    ############################################################################
    """
    Adds an additional module to the TACK, keeps the instance here for 
        convenience
    
    param - cClassName : Classobj
    params : All params that should be passed to object constructor 
    """
    def AddModule(self, cClassName, *lArgs, **lpKwargs):
        self._dModules[cClassName] = {'lArgs' : lArgs, 'lpKwargs' : lpKwargs}
    ############################################################################
    
    ############################################################################
    """
    Puts things in motion...
    """
    def Initialise(self):
        # Create Logger Module
        self._lModules.append(Logger(self._sLogPath, self._nLogFileLevel, self._nLogPrintLevel))
        
        # Create Ticker
        oTicker = Ticker(self._nTickerFrameRate)
        self._lModules.append(oTicker)
        
        # Initialise PyGame
        pygame.init()
        
        # Create extra modules
        for cClassName in self._dModules.keys():
            lArgs = self._dModules[cClassName]['lArgs']
            lpKwargs = self._dModules[cClassName]['lpKwargs']
            self._lModules.append(cClassName(*lArgs, **lpKwargs))
        
        # Go!
        oTicker.Initiate()
        
        # Let PyGame Cleanup
        pygame.quit()
    ############################################################################
################################################################################